package cn.flying.cloud.base.common.excel;

import javax.servlet.http.HttpServletResponse;

import java.util.List;
import java.util.function.Consumer;

import org.springframework.web.multipart.MultipartFile;

/**
 * Excel处理
 *
 * @author: admin
 * @date: 2024年11月26日 11:19
 * @version: 1.0
 */
public interface ExcelService {

    /**
     * 将数据列表写入Excel文件并响应给请求
     *
     * @param response  请求响应
     * @param fileName  文件名
     * @param sheetName Excel sheet 名
     * @param head      Excel head 头
     * @param data      数据列表
     * @param <T>       泛型，保证 head 和 data 类型的一致性
     */
    <T> void writeExcel(HttpServletResponse response, String fileName, String sheetName, Class<T> head, List<T> data);


    /**
     * 根据模板导出，写入Excel文件并响应给请求
     *
     * @param response  请求响应
     * @param fileName  文件名
     * @param sheetName Excel sheet 名
     * @param head      Excel head 头
     * @param data      数据列表
     * @param <T>       泛型，保证 head 和 data 类型的一致性
     */
    <T> void writeExcel(HttpServletResponse response, String templatePath, String fileName, String sheetName, Class<T> head, List<T> data);

    /**
     * 读取Excel，同步返回数据（不建议解析大数据量使用）
     *
     * @param file  Excel文件
     * @param head  实体类映射
     * @param sheet sheet
     * @param <T>   泛型，保证 head 和 data 类型的一致性
     */
    <T> List<T> readExcel(MultipartFile file, Class<T> head, int sheet, Integer headRowNumber);

    /**
     * 读取Excel
     *
     * @param file          Excel文件
     * @param head          实体类映射
     * @param sheet         sheet
     * @param headRowNumber 表格头所在行
     * @param list          返回的数据
     * @param <T>           泛型，保证 head 和 data 类型的一致性
     * @return 返回
     */
    <T> List<T> readExcel(MultipartFile file, Class<T> head, int sheet, Integer headRowNumber, List<T> list);

    /**
     * 读取Excel
     * 读取之后直接根据传入的处理类调用处理，每500条数据处理一次，不返回数据
     *
     * @param file          Excel文件
     * @param head          实体类映射
     * @param sheet         sheet
     * @param headRowNumber 表格头所在行
     * @param consumer      处理类
     * @param <T>           泛型，保证 head 和 data 类型的一致性
     */
    <T> void readExcel(MultipartFile file, Class<T> head, int sheet, Integer headRowNumber, Consumer<List<T>> consumer);

}